Setup

library("tidyverse")
library("ggpubr")
library("zoo")
setwd("/mnt/LocalData/behaviour/aDN/aDN_behaviour")



Colours …

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}
gg_color_hue(2)
[1] "#F8766D" "#00BFC4"



getwd()
[1] "/mnt/LocalData/behaviour/aDN/aDN_behaviour"
# rawdata_list <- list.files("../",recursive = TRUE) %>% str_subset("_ALLDATA.csv") %>% str_subset("_Male_")
# all_rawdata <- tibble()
# for (rawdata_file in rawdata_list) {
#   temp <- read_csv(paste0("../",rawdata_file),progress = FALSE)
#   all_rawdata <- bind_rows(all_rawdata,temp)
# }
# # added for testing purposes - function not used in actual code
# female_pos <- function(theta,dist,ori,xmale,xfemale){
#   yrel=calculate_yrel(theta,dist)
#   xrel=calculate_xrel(ori,xmale,xfemale,yrel)
#   return(c(xrel,yrel))
# }
# calculates relative y value based on data from feat.mat
calculate_yrel <- function(theta,dist){
  yrel=dist*cos(theta)
  return(yrel)
}
calculate_xrel <- function(ori,xmale,xfemale,yrel,ppm=14.85){
  xmale_mm=xmale/ppm
  xfemale_mm=xfemale/ppm
  xrel = (xfemale_mm - (cos(ori)*yrel+xmale_mm))/(sin(ori))
  return(xrel)
} 
calculate_xrel_abs <- function(theta,dist){
  xrel=dist*sin(theta)
  return(xrel)
}
unique(all_rawdata$treatment)
[1] "C" "B" "D" "A" NA 
100*sum(is.na(all_rawdata$treatment))/nrow(all_rawdata)
[1] 1.449275
unique(all_rawdata$unique_fly[is.na(all_rawdata$treatment)])
[1] "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2_9"  "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2_10" "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_9_31" "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_9_32"

Megan says through out these individuals from video 1234_2 arena 5 and video 1234_9 arena 16

all_rawdata %>% 
  filter(FileName == "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2") %>% 
  filter(Id == 3) %>% 
  filter(dist_to_other__mm > 2.5) %>% 
  summarise(unique_fly = unique(unique_fly),
            l_ipsi = sum(wing_l_ang__rad<(-35*pi/180) & rel_x_abs_corr_other<0, na.rm = TRUE)/length(Frame),
            r_ipsi = sum(wing_r_ang__rad>(35*pi/180) & rel_x_abs_corr_other>0, na.rm = TRUE)/length(Frame),
            l_contra = sum(wing_l_ang__rad<(-35*pi/180) & rel_x_abs_corr_other>0, na.rm = TRUE)/length(Frame),
            r_contra = sum(wing_r_ang__rad>(35*pi/180) & rel_x_abs_corr_other<0, na.rm = TRUE)/length(Frame)
            )
all_rawdata <- all_rawdata %>% 
  arrange(FileName,Id,Frame) %>% 
  group_by(unique_fly) %>% 
  mutate(rollavg_dist_to_other = rollmean(dist_to_other__mm, 150, fill = c(NA,0,NA), align = c("center")))
all_rawdata
write_csv(all_rawdata,"all_rawdata.csv")
wind <- 600
p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(max_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(35*pi/180),
                                 na.rm = TRUE)/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            left_wing_index = 100*sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-35*pi/180),
                                 na.rm = TRUE)/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=left_wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            right_wing_index = 100*sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(35*pi/180),
                                 na.rm = TRUE)/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=right_wing_index)) +
    geom_boxplot()
p4 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            both_wing_index = 100*sum(min_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(35*pi/180),
                                 na.rm = TRUE)/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=both_wing_index)) +
    geom_boxplot()
ggarrange(plotlist = list(p1,p4,p2,p3),
          labels = c("either wing","both wings","left wing","right wing"),
          hjust = -0.6,
          vjust = 2,
          ncol = 4,
          nrow = 1)

wind <- 600
p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(max_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(35*pi/180),
                                 na.rm = TRUE)/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            ipsi_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-35*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<=0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(35*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>=0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=ipsi_wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            contra_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-35*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(35*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=contra_wing_index)) +
    geom_boxplot()
  
ggarrange(plotlist = list(p1,p2,p3),
          labels = c("either wing","ipsi wing","contra wing"),
          hjust = -0.6,
          vjust = 2,
          ncol = 3,
          nrow = 1)

wing_thresh <- 15
wind <- 600
p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(max_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180),
                                 na.rm = TRUE)/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            ipsi_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<=0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>=0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=ipsi_wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            contra_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=contra_wing_index)) +
    geom_boxplot()
  
ggarrange(plotlist = list(p1,p2,p3),
          labels = c("either wing","ipsi wing","contra wing"),
          hjust = -0.6,
          vjust = 2,
          ncol = 3,
          nrow = 1)

wing_thresh <- 15
wind <- 600
p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(max_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180),
                                 na.rm = TRUE)/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            ipsi_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<=0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>=0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                                         )
            ) %>%
  ggplot(aes(x=genotype,y=ipsi_wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            contra_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=contra_wing_index)) +
    geom_boxplot()
p4 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            ratio = ((sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<=0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>=0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                                         )
                     )/
                    ((sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                                        )
               )
            ) %>%
  ggplot(aes(x=genotype,y=ratio)) +
    geom_boxplot()
  
ggarrange(plotlist = list(p1,p2,p3,p4),
          labels = c("either wing","ipsi wing","contra wing","ipsi:contra"),
          hjust = -0.6,
          vjust = 2,
          ncol = 4,
          nrow = 1)

all_rawdata <- all_rawdata %>% select(-ipsi_wing,-contra_wing)
all_rawdata <- all_rawdata %>% 
  mutate(ipsi_wing = if_else(((wing_l_ang__rad<(-15*pi/180) & 
                                rel_x_abs_corr_other<=0) | 
                               (wing_r_ang__rad>(15*pi/180) & 
                                  rel_x_abs_corr_other>=0)),1,0),
         contra_wing = if_else(((wing_l_ang__rad<(-15*pi/180) & 
                                rel_x_abs_corr_other>0) | 
                               (wing_r_ang__rad>(15*pi/180) & 
                                  rel_x_abs_corr_other<0)),1,0)
         ) %>% 
  replace_na(list(ipsi_wing = 0)) %>%
  replace_na(list(contra_wing = 0))
all_rawdata
p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            ipsi_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<=0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>=0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                                         )
            ) %>%
  ggplot(aes(x=genotype,y=ipsi_wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            contra_wing_index = 100*(sum(wing_l_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<(-wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>0,
                                 na.rm = TRUE) +
                                   sum(wing_r_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(wing_thresh*pi/180) &
                                        rel_x_abs_corr_other[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]<0,
                                 na.rm = TRUE)
                                 )/
                                 length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=contra_wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  #filter(max_wing_ang__rad > (35*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(ipsi_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p4 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  #filter(max_wing_ang__rad > (35*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(contra_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
ggarrange(plotlist = list(p1,p3,p2,p4),
          labels = c("ipsi raw","ipsi column","contra raw","contra column"),
          hjust = -0.6,
          vjust = 2,
          ncol = 2,
          nrow = 2)

p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (15*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(ipsi_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (20*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(ipsi_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (25*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(ipsi_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p4 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (30*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(ipsi_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p5 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (35*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(ipsi_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
ggarrange(plotlist = list(p1,p3,p2,p4,p5),
          labels = c("ipsi, >15deg","ipsi, >20deg","ipsi, >25deg","ipsi, >30deg","ipsi, >35deg"),
          hjust = 0,
          vjust = 2,
          ncol = 5,
          nrow = 1)

p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (15*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(contra_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (20*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(contra_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (25*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(contra_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p4 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (30*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(contra_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p5 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  filter(max_wing_ang__rad > (35*pi/180)) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(contra_wing[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ],
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*600)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        (which.max(SmoothedCourtship)+(25*600))),
                                                                                  (which.max(SmoothedCourtship)+(25*600))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
ggarrange(plotlist = list(p1,p3,p2,p4,p5),
          labels = c("contra, >15deg","contra, >20deg","contra, >25deg","contra, >30deg","contra, >35deg"),
          hjust = 0,
          vjust = 2,
          ncol = 5,
          nrow = 1)

all_rawdata <- all_rawdata %>% 
  mutate(ipsi_wing_ang = if_else(rel_x_abs_corr_other>0,
                                 wing_r_ang__rad,
                                 wing_l_ang__rad),
         contra_wing_ang = if_else(rel_x_abs_corr_other<0,
                                 wing_r_ang__rad,
                                 wing_l_ang__rad)
         )
all_rawdata
wind <- 600
p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(ipsi_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(15*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(ipsi_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(20*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(ipsi_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(25*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p4 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(ipsi_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(30*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p5 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(ipsi_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(35*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
ggarrange(plotlist = list(p1,p3,p2,p4,p5),
          labels = c("ipsi, >15deg","ipsi, >20deg","ipsi, >25deg","ipsi, >30deg","ipsi, >35deg"),
          hjust = 0,
          vjust = 2,
          ncol = 5,
          nrow = 1)

wind <- 600
p1 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(contra_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(15*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>% 
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p2 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(contra_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(20*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p3 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(contra_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(25*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p4 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(contra_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(30*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
p5 <- all_rawdata %>% 
  filter(genotype != "CS") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            wing_index = 100*sum(abs(contra_wing_ang[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>(35*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     )) %>%
  ggplot(aes(x=genotype,y=wing_index)) +
    geom_boxplot()
ggarrange(plotlist = list(p1,p3,p2,p4,p5),
          labels = c("contra, >15deg","contra, >20deg","contra, >25deg","contra, >30deg","contra, >35deg"),
          hjust = 0,
          vjust = 2,
          ncol = 5,
          nrow = 1)

all_rawdata <- all_rawdata %>% 
  mutate(ipsi_wing_len = if_else(rel_x_abs_corr_other>0,
                                 wing_r_len__px,
                                 wing_l_len__px),
         contra_wing_len = if_else(rel_x_abs_corr_other<0,
                                 wing_r_len__px,
                                 wing_l_len__px)
         )
all_rawdata
temp <- all_rawdata %>% 
  filter(dist_to_other__mm > 2.5) %>% 
  filter(dist_to_other__mm < 10) %>% 
  filter(max_wing_ang__rad < (2*pi/3)) %>%
  filter(min_wing_ang__rad >= (0)) %>%
  filter(wing_l_ang__rad > (-2*pi/3)) %>%
  filter(wing_r_ang__rad < (2*pi/3)) %>%
  filter(wing_l_ang__rad <= 0) %>%
  filter(wing_r_ang__rad >= 0) %>%
  filter(dist_to_wall__mm > 2) #%>%
  #filter(max_wing_ang__rad > (15*pi/180)) 
  
  
p1 <- temp %>%
  filter(genotype == "A") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p2 <- temp %>%
  filter(genotype == "B") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p3 <- temp %>%
  filter(genotype == "C") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p4 <- temp %>%
  filter(genotype == "D") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
ggarrange(plotlist = list(p1,p2,p3,p4),
          labels = c("A","B","C","D"),
          #hjust = 1,
          ncol = 2,
          nrow = 2)

rm(temp)
temp <- all_rawdata %>% 
  filter(dist_to_other__mm > 2.5) %>% 
  filter(dist_to_other__mm < 10) %>% 
  filter(max_wing_ang__rad < (2*pi/3)) %>%
  filter(min_wing_ang__rad >= (0)) %>%
  filter(wing_l_ang__rad > (-2*pi/3)) %>%
  filter(wing_r_ang__rad < (2*pi/3)) %>%
  filter(wing_l_ang__rad <= (0)) %>%
  filter(wing_r_ang__rad >= (0)) %>%
  filter(dist_to_wall__mm > 2) %>%
  filter(max_wing_ang__rad > (15*pi/180)) 
  
  
p1 <- temp %>%
  filter(genotype == "A") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p2 <- temp %>%
  filter(genotype == "B") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p3 <- temp %>%
  filter(genotype == "C") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p4 <- temp %>%
  filter(genotype == "D") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") +
  theme_void() +
  coord_polar()
ggarrange(plotlist = list(p1,p2,p3,p4),
          labels = c("A","B","C","D"),
          #hjust = 1,
          ncol = 2,
          nrow = 2)

rm(temp)
temp <- all_rawdata %>% 
  filter(dist_to_other__mm > 2.5) %>% 
  filter(dist_to_other__mm < 10) %>% 
  filter(max_wing_ang__rad < (2*pi/3)) %>%
  filter(min_wing_ang__rad >= (0)) %>%
  filter(wing_l_ang__rad > (-2*pi/3)) %>%
  filter(wing_r_ang__rad < (2*pi/3)) %>%
  filter(wing_l_ang__rad <= (0)) %>%
  filter(wing_r_ang__rad >= (0)) %>%
  filter(dist_to_wall__mm > 2) %>%
  filter(max_wing_ang__rad > (15*pi/180)) 
  
  
p1 <- temp %>%
  filter(genotype == "A") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(10,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p2 <- temp %>%
  filter(genotype == "B") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(10,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p3 <- temp %>%
  filter(genotype == "C") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(10,1000),na.value = "white") +
  theme_void() +
  coord_polar()
p4 <- temp %>%
  filter(genotype == "D") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(10,1000),na.value = "white") +
  theme_void() +
  coord_polar()
ggarrange(plotlist = list(p1,p2,p3,p4),
          labels = c("A","B","C","D"),
          #hjust = 1,
          ncol = 2,
          nrow = 2)

rm(temp)
temp <- all_rawdata %>% 
  filter(dist_to_other__mm > 2.5) %>% 
  filter(dist_to_other__mm < 10) %>% 
  filter(max_wing_ang__rad < (2*pi/3)) %>%
  filter(min_wing_ang__rad >= (0)) %>%
  filter(wing_l_ang__rad > (-2*pi/3)) %>%
  filter(wing_r_ang__rad < (2*pi/3)) %>%
  filter(wing_l_ang__rad <= (0)) %>%
  filter(wing_r_ang__rad >= (0)) %>%
  filter(dist_to_wall__mm > 2) %>%
  filter(min_wing_ang__rad > (15*pi/180)) 
  
  
p1 <- temp %>%
  filter(genotype == "A") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,500),na.value = "white") +
  theme_void() +
  coord_polar()
p2 <- temp %>%
  filter(genotype == "B") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,500),na.value = "white") +
  theme_void() +
  coord_polar()
p3 <- temp %>%
  filter(genotype == "C") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,500),na.value = "white") +
  theme_void() +
  coord_polar()
p4 <- temp %>%
  filter(genotype == "D") %>% 
  ggplot() +
  geom_bin2d(aes(x=abs(ipsi_wing_ang), y=ipsi_wing_len), bins = c(200,50)) +
  geom_bin2d(aes(x=-abs(contra_wing_ang), y=contra_wing_len), bins = c(200,50)) +
  xlim(-pi,pi) +
  ylim(0,60) + 
  scale_fill_continuous(type = "viridis",limits = c(0,500),na.value = "white") +
  theme_void() +
  coord_polar()
ggarrange(plotlist = list(p1,p2,p3,p4),
          labels = c("A","B","C","D"),
          #hjust = 1,
          ncol = 2,
          nrow = 2)

rm(temp)
LS0tCnRpdGxlOiAiKipNYWxlIGNvdXJ0c2hpcCBiZWhhdmlvdXIgLSBhRE4gPiBUTlQgLSBpcHNpIGNvbnRyYSoqIgphdXRob3I6ICJBYXJvbiBNLiBBbGxlbiIKZGF0ZTogIjEwIE1hcmNoIDIwMjAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCjxici8+Cjxici8+CgojICoqU2V0dXAqKgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgiZ2dwdWJyIikKbGlicmFyeSgiem9vIikKc2V0d2QoIi9tbnQvTG9jYWxEYXRhL2JlaGF2aW91ci9hRE4vYUROX2JlaGF2aW91ciIpCmBgYAoKCjxici8+Cjxici8+CgojIyMgQ29sb3VycyAuLi4KIApgYGB7cn0KZ2dfY29sb3JfaHVlIDwtIGZ1bmN0aW9uKG4pIHsKICBodWVzID0gc2VxKDE1LCAzNzUsIGxlbmd0aCA9IG4gKyAxKQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dCn0KYGBgCgpgYGB7cn0KZ2dfY29sb3JfaHVlKDIpCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7cn0KZ2V0d2QoKQpgYGAKCgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpnZW5vdHlwZXMgPC0gcmVhZF90c3YoIi4uLzIwMTlfMDNfMDZfQ291cnRzaGlwL2dlbm90eXBlLnRzdiIsY29sX25hbWVzID0gVFJVRSkKZ2Vub3R5cGVzCmBgYAoKCgoKCmBgYHtyfQpnZW5vdHlwZXMgPC0gZ2Vub3R5cGVzICU+JSAKICBtdXRhdGUoYXJlbmEgPSByb3VuZChpZl9lbHNlKChmbHlfaWQgJSUgMikgPT0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseV9pZC8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZseV9pZCsxKS8yKSwKICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAwKSwKICAgICAgICAgdHJlYXRtZW50ID0gZ2Vub3R5cGUsCiAgICAgICAgIHNleCA9ICJtYWxlIikKZ2Vub3R5cGVzCmBgYAoKCgpgYGB7cn0KYXJlbmFfdHJlYXRtZW50IDwtIGdlbm90eXBlcyAlPiUgCiAgdW5pdGUoInVuaXF1ZV9hcmVuYSIsdmlkZW8sYXJlbmEsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgc2VsZWN0KHVuaXF1ZV9hcmVuYSx0cmVhdG1lbnQpCmdlbm90eXBlcyA8LSBnZW5vdHlwZXMgJT4lIHNlbGVjdCgtdHJlYXRtZW50LC1hcmVuYSkKYXJlbmFfdHJlYXRtZW50CmBgYAoKCgoKYGBge3Igd2FybmluZz1GQUxTRX0KIyByYXdkYXRhX2xpc3QgPC0gbGlzdC5maWxlcygiLi4vIixyZWN1cnNpdmUgPSBUUlVFKSAlPiUgc3RyX3N1YnNldCgiX0FMTERBVEEuY3N2IikgJT4lIHN0cl9zdWJzZXQoIl9NYWxlXyIpCiMgYWxsX3Jhd2RhdGEgPC0gdGliYmxlKCkKIyBmb3IgKHJhd2RhdGFfZmlsZSBpbiByYXdkYXRhX2xpc3QpIHsKIyAgIHRlbXAgPC0gcmVhZF9jc3YocGFzdGUwKCIuLi8iLHJhd2RhdGFfZmlsZSkscHJvZ3Jlc3MgPSBGQUxTRSkKIyAgIGFsbF9yYXdkYXRhIDwtIGJpbmRfcm93cyhhbGxfcmF3ZGF0YSx0ZW1wKQojIH0KYGBgCgoKCgoKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhIDwtIHJlYWRfY3N2KCJhbGxfcmF3ZGF0YS5jc3YiKQojYWxsX3Jhd2RhdGEgPC0gYWxsX3Jhd2RhdGEgJT4lIHNlbGVjdCgtZ2Vub3R5cGUpCmFsbF9yYXdkYXRhCmBgYAoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUKICBmdWxsX2pvaW4oeCA9IGFsbF9yYXdkYXRhLCB5ID0gZ2Vub3R5cGVzLCBieSA9IGMoIkZpbGVOYW1lIj0idmlkZW8iLCJJZCI9ImZseV9pZCIpKSAlPiUgCiAgcmVwbGFjZV9uYShsaXN0KGdlbm90eXBlID0gIkNTIikpICU+JSAKICByZXBsYWNlX25hKGxpc3Qoc2V4ID0gImZlbWFsZSIpKQphbGxfcmF3ZGF0YQpgYGAKCgoKCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgdW5pdGUoInVuaXF1ZV9hcmVuYSIsRmlsZU5hbWUsQXJlbmEsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgbGVmdF9qb2luKHk9YXJlbmFfdHJlYXRtZW50LCBieSA9ICJ1bmlxdWVfYXJlbmEiKSAlPiUgCiAgc2VsZWN0KC11bmlxdWVfYXJlbmEpCmFsbF9yYXdkYXRhCmBgYAoKYGBge3J9CmFsbF9yYXdkYXRhICU+JSBmaWx0ZXIoZ2Vub3R5cGU9PSJDUyIpCmBgYAoKCgpgYGB7cn0KIyAjIGFkZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIC0gZnVuY3Rpb24gbm90IHVzZWQgaW4gYWN0dWFsIGNvZGUKIyBmZW1hbGVfcG9zIDwtIGZ1bmN0aW9uKHRoZXRhLGRpc3Qsb3JpLHhtYWxlLHhmZW1hbGUpewojICAgeXJlbD1jYWxjdWxhdGVfeXJlbCh0aGV0YSxkaXN0KQojICAgeHJlbD1jYWxjdWxhdGVfeHJlbChvcmkseG1hbGUseGZlbWFsZSx5cmVsKQojICAgcmV0dXJuKGMoeHJlbCx5cmVsKSkKIyB9CgoKCgojIGNhbGN1bGF0ZXMgcmVsYXRpdmUgeSB2YWx1ZSBiYXNlZCBvbiBkYXRhIGZyb20gZmVhdC5tYXQKY2FsY3VsYXRlX3lyZWwgPC0gZnVuY3Rpb24odGhldGEsZGlzdCl7CiAgeXJlbD1kaXN0KmNvcyh0aGV0YSkKICByZXR1cm4oeXJlbCkKfQpjYWxjdWxhdGVfeHJlbCA8LSBmdW5jdGlvbihvcmkseG1hbGUseGZlbWFsZSx5cmVsLHBwbT0xNC44NSl7CiAgeG1hbGVfbW09eG1hbGUvcHBtCiAgeGZlbWFsZV9tbT14ZmVtYWxlL3BwbQogIHhyZWwgPSAoeGZlbWFsZV9tbSAtIChjb3Mob3JpKSp5cmVsK3htYWxlX21tKSkvKHNpbihvcmkpKQogIHJldHVybih4cmVsKQp9IApjYWxjdWxhdGVfeHJlbF9hYnMgPC0gZnVuY3Rpb24odGhldGEsZGlzdCl7CiAgeHJlbD1kaXN0KnNpbih0aGV0YSkKICByZXR1cm4oeHJlbCkKfQoKYGBgCgoKCgoKCgpgYGB7cn0KYWxsX3Jhd2RhdGEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGFycmFuZ2UoRmlsZU5hbWUsQXJlbmEsRnJhbWUpCgphbGxfcmF3ZGF0YSRyZWxfeV9vdGhlciA8LSBOQQphbGxfcmF3ZGF0YSRyZWxfeF9vdGhlciA8LSBOQQphbGxfcmF3ZGF0YSRyZWxfeF9hYnNfb3RoZXIgPC0gTkEKYWxsX3Jhd2RhdGEkcmVsX3hfYWJzX2NvcnJfb3RoZXIgPC0gTkEKCmFsbF9yYXdkYXRhJHJlbF95X290aGVyW3NlcSgxLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSA9IGNhbGN1bGF0ZV95cmVsKGFsbF9yYXdkYXRhJGZhY2luZ19hbmdsZV9fcmFkW3NlcSgxLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3Jhd2RhdGEkZGlzdF90b19vdGhlcl9fbW1bc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildKQoKYWxsX3Jhd2RhdGEkcmVsX3hfb3RoZXJbc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildID0gY2FsY3VsYXRlX3hyZWwob3JpID0gYWxsX3Jhd2RhdGEkb3JpX19yYWRbc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWFsZSA9IGFsbF9yYXdkYXRhJHBvc194X19weFtzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmZW1hbGUgPSBhbGxfcmF3ZGF0YSRwb3NfeF9fcHhbc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5cmVsID0gY2FsY3VsYXRlX3lyZWwoYWxsX3Jhd2RhdGEkZmFjaW5nX2FuZ2xlX19yYWRbc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3Jhd2RhdGEkZGlzdF90b19vdGhlcl9fbW1bc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildKSkKCmFsbF9yYXdkYXRhJHJlbF94X2Fic19vdGhlcltzZXEoMSxucm93KGFsbF9yYXdkYXRhKSwyKV0gPSBjYWxjdWxhdGVfeHJlbF9hYnMoYWxsX3Jhd2RhdGEkZmFjaW5nX2FuZ2xlX19yYWRbc2VxKDEsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9yYXdkYXRhJGRpc3RfdG9fb3RoZXJfX21tW3NlcSgxLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSkKCgphbGxfcmF3ZGF0YSRyZWxfeV9vdGhlcltzZXEoMixucm93KGFsbF9yYXdkYXRhKSwyKV0gPSBjYWxjdWxhdGVfeXJlbChhbGxfcmF3ZGF0YSRmYWNpbmdfYW5nbGVfX3JhZFtzZXEoMixucm93KGFsbF9yYXdkYXRhKSwyKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9yYXdkYXRhJGRpc3RfdG9fb3RoZXJfX21tW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSkKCmFsbF9yYXdkYXRhJHJlbF94X290aGVyW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSA9IGNhbGN1bGF0ZV94cmVsKG9yaSA9IGFsbF9yYXdkYXRhJG9yaV9fcmFkW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1hbGUgPSBhbGxfcmF3ZGF0YSRwb3NfeF9fcHhbc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZmVtYWxlID0gYWxsX3Jhd2RhdGEkcG9zX3hfX3B4W3NlcSgxLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXJlbCA9IGNhbGN1bGF0ZV95cmVsKGFsbF9yYXdkYXRhJGZhY2luZ19hbmdsZV9fcmFkW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9yYXdkYXRhJGRpc3RfdG9fb3RoZXJfX21tW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSkpCgphbGxfcmF3ZGF0YSRyZWxfeF9hYnNfb3RoZXJbc2VxKDIsbnJvdyhhbGxfcmF3ZGF0YSksMildID0gY2FsY3VsYXRlX3hyZWxfYWJzKGFsbF9yYXdkYXRhJGZhY2luZ19hbmdsZV9fcmFkW3NlcSgyLG5yb3coYWxsX3Jhd2RhdGEpLDIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfcmF3ZGF0YSRkaXN0X3RvX290aGVyX19tbVtzZXEoMixucm93KGFsbF9yYXdkYXRhKSwyKV0pCgoKYWxsX3Jhd2RhdGEkcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2goYWxsX3Jhd2RhdGEkcmVsX3hfb3RoZXI8MCldID0gLWFsbF9yYXdkYXRhJHJlbF94X2Fic19vdGhlclt3aGljaChhbGxfcmF3ZGF0YSRyZWxfeF9vdGhlcjwwKV0KYWxsX3Jhd2RhdGEkcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2goYWxsX3Jhd2RhdGEkcmVsX3hfb3RoZXI+MCldID0gYWxsX3Jhd2RhdGEkcmVsX3hfYWJzX290aGVyW3doaWNoKGFsbF9yYXdkYXRhJHJlbF94X290aGVyPjApXQoKYWxsX3Jhd2RhdGEKYGBgCgoKCgpgYGB7cn0KdW5pcXVlKGFsbF9yYXdkYXRhJHRyZWF0bWVudCkKYGBgCgpgYGB7cn0KMTAwKnN1bShpcy5uYShhbGxfcmF3ZGF0YSR0cmVhdG1lbnQpKS9ucm93KGFsbF9yYXdkYXRhKQoKYGBgCgpgYGB7cn0KYWxsX3Jhd2RhdGFbaXMubmEoYWxsX3Jhd2RhdGEkdHJlYXRtZW50KSxdCmBgYAoKCmBgYHtyfQp1bmlxdWUoYWxsX3Jhd2RhdGEkdW5pcXVlX2ZseVtpcy5uYShhbGxfcmF3ZGF0YSR0cmVhdG1lbnQpXSkKYGBgCgpNZWdhbiBzYXlzIHRocm91Z2ggb3V0IHRoZXNlIGluZGl2aWR1YWxzIGZyb20gdmlkZW8gMTIzNF8yIGFyZW5hIDUgYW5kIHZpZGVvIDEyMzRfOSBhcmVuYSAxNgoKCgpgYGB7cn0KCmBgYAoKCgpgYGB7cn0Kd3JpdGVfY3N2KGFsbF9yYXdkYXRhLCJhbGxfcmF3ZGF0YS5jc3YiKQpgYGAKCgoKCgpgYGB7cn0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDMpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICBzdW1tYXJpc2UodW5pcXVlX2ZseSA9IHVuaXF1ZSh1bmlxdWVfZmx5KSwKICAgICAgICAgICAgbF9pcHNpID0gc3VtKHdpbmdfbF9hbmdfX3JhZDwoLTM1KnBpLzE4MCkgJiByZWxfeF9hYnNfY29ycl9vdGhlcjwwLCBuYS5ybSA9IFRSVUUpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIHJfaXBzaSA9IHN1bSh3aW5nX3JfYW5nX19yYWQ+KDM1KnBpLzE4MCkgJiByZWxfeF9hYnNfY29ycl9vdGhlcj4wLCBuYS5ybSA9IFRSVUUpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGxfY29udHJhID0gc3VtKHdpbmdfbF9hbmdfX3JhZDwoLTM1KnBpLzE4MCkgJiByZWxfeF9hYnNfY29ycl9vdGhlcj4wLCBuYS5ybSA9IFRSVUUpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIHJfY29udHJhID0gc3VtKHdpbmdfcl9hbmdfX3JhZD4oMzUqcGkvMTgwKSAmIHJlbF94X2Fic19jb3JyX290aGVyPDAsIG5hLnJtID0gVFJVRSkvbGVuZ3RoKEZyYW1lKQogICAgICAgICAgICApCgpgYGAKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhIDwtIGFsbF9yYXdkYXRhICU+JSAKICBhcnJhbmdlKEZpbGVOYW1lLElkLEZyYW1lKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIG11dGF0ZShyb2xsYXZnX2Rpc3RfdG9fb3RoZXIgPSByb2xsbWVhbihkaXN0X3RvX290aGVyX19tbSwgMTUwLCBmaWxsID0gYyhOQSwwLE5BKSwgYWxpZ24gPSBjKCJjZW50ZXIiKSkpCmFsbF9yYXdkYXRhCmBgYAoKCgoKYGBge3J9CndyaXRlX2NzdihhbGxfcmF3ZGF0YSwiYWxsX3Jhd2RhdGEuY3N2IikKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0Kd2luZCA8LSA2MDAKcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0obWF4X3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDM1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGxlZnRfd2luZ19pbmRleCA9IDEwMCpzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtMzUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWxlZnRfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHJpZ2h0X3dpbmdfaW5kZXggPSAxMDAqc3VtKHdpbmdfcl9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oMzUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXJpZ2h0X3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBib3RoX3dpbmdfaW5kZXggPSAxMDAqc3VtKG1pbl93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPigzNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9Ym90aF93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwNCxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJlaXRoZXIgd2luZyIsImJvdGggd2luZ3MiLCJsZWZ0IHdpbmciLCJyaWdodCB3aW5nIiksCiAgICAgICAgICBoanVzdCA9IC0wLjYsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gNCwKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKCgoKCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0Kd2luZCA8LSA2MDAKcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0obWF4X3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDM1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGlwc2lfd2luZ19pbmRleCA9IDEwMCooc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLTM1KnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSh3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDM1KnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWlwc2lfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGNvbnRyYV93aW5nX2luZGV4ID0gMTAwKihzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtMzUqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPigzNSpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWNvbnRyYV93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKCiAgCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiZWl0aGVyIHdpbmciLCJpcHNpIHdpbmciLCJjb250cmEgd2luZyIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0Kd2luZ190aHJlc2ggPC0gMTUKd2luZCA8LSA2MDAKcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0obWF4X3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KHdpbmdfdGhyZXNoKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGlwc2lfd2luZ19pbmRleCA9IDEwMCooc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLXdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSh3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KHdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWlwc2lfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGNvbnRyYV93aW5nX2luZGV4ID0gMTAwKihzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtd2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWNvbnRyYV93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKCiAgCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiZWl0aGVyIHdpbmciLCJpcHNpIHdpbmciLCJjb250cmEgd2luZyIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0Kd2luZ190aHJlc2ggPC0gMTUKd2luZCA8LSA2MDAKcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0obWF4X3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KHdpbmdfdGhyZXNoKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGlwc2lfd2luZ19pbmRleCA9IDEwMCooc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLXdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSh3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KHdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICApICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWlwc2lfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGNvbnRyYV93aW5nX2luZGV4ID0gMTAwKihzdW0od2luZ19sX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtd2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWNvbnRyYV93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKCgoKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgcmF0aW8gPSAoKHN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC13aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPj0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICAgICAgICAoKHN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC13aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSh3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KHdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgKQogICAgICAgICAgICApICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXJhdGlvKSkgKwogICAgZ2VvbV9ib3hwbG90KCkKCgoKCgoKCiAgCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiZWl0aGVyIHdpbmciLCJpcHNpIHdpbmciLCJjb250cmEgd2luZyIsImlwc2k6Y29udHJhIiksCiAgICAgICAgICBoanVzdCA9IC0wLjYsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gNCwKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgc2VsZWN0KC1pcHNpX3dpbmcsLWNvbnRyYV93aW5nKQpgYGAKCgoKYGBge3J9CmFsbF9yYXdkYXRhIDwtIGFsbF9yYXdkYXRhICU+JSAKICBtdXRhdGUoaXBzaV93aW5nID0gaWZfZWxzZSgoKHdpbmdfbF9hbmdfX3JhZDwoLTE1KnBpLzE4MCkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlcjw9MCkgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aW5nX3JfYW5nX19yYWQ+KDE1KnBpLzE4MCkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyPj0wKSksMSwwKSwKICAgICAgICAgY29udHJhX3dpbmcgPSBpZl9lbHNlKCgod2luZ19sX2FuZ19fcmFkPCgtMTUqcGkvMTgwKSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyPjApIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2luZ19yX2FuZ19fcmFkPigxNSpwaS8xODApICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlcjwwKSksMSwwKQogICAgICAgICApICU+JSAKICByZXBsYWNlX25hKGxpc3QoaXBzaV93aW5nID0gMCkpICU+JQogIHJlcGxhY2VfbmEobGlzdChjb250cmFfd2luZyA9IDApKQphbGxfcmF3ZGF0YQpgYGAKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KCgpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBpcHNpX3dpbmdfaW5kZXggPSAxMDAqKHN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC13aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPih3aW5nX3RocmVzaCpwaS8xODApICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF94X2Fic19jb3JyX290aGVyW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPj0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1pcHNpX3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBjb250cmFfd2luZ19pbmRleCA9IDEwMCooc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwoLXdpbmdfdGhyZXNoKnBpLzE4MCkgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3hfYWJzX2NvcnJfb3RoZXJbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKHdpbmdfcl9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4od2luZ190aHJlc2gqcGkvMTgwKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfeF9hYnNfY29ycl9vdGhlclt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTwwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1jb250cmFfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCgoKCgpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oaXBzaV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oY29udHJhX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCgoKCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAzLHAyLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoImlwc2kgcmF3IiwiaXBzaSBjb2x1bW4iLCJjb250cmEgcmF3IiwiY29udHJhIGNvbHVtbiIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTZ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGlwc2lfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDIwKnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oaXBzaV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShpcHNpX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzMCpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGlwc2lfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oaXBzaV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQoKCgoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMyxwMixwNCxwNSksCiAgICAgICAgICBsYWJlbHMgPSBjKCJpcHNpLCA+MTVkZWciLCJpcHNpLCA+MjBkZWciLCJpcHNpLCA+MjVkZWciLCJpcHNpLCA+MzBkZWciLCJpcHNpLCA+MzVkZWciKSwKICAgICAgICAgIGhqdXN0ID0gMCwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSA1LAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD02fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShjb250cmFfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDIwKnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oY29udHJhX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGNvbnRyYV93aW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzAqcGkvMTgwKSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShjb250cmFfd2luZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oY29udHJhX3dpbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCgoKCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAzLHAyLHA0LHA1KSwKICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyYSwgPjE1ZGVnIiwiY29udHJhLCA+MjBkZWciLCJjb250cmEsID4yNWRlZyIsImNvbnRyYSwgPjMwZGVnIiwiY29udHJhLCA+MzVkZWciKSwKICAgICAgICAgIGhqdXN0ID0gMCwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSA1LAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKCgoKCgoKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhIDwtIGFsbF9yYXdkYXRhICU+JSAKICBtdXRhdGUoaXBzaV93aW5nX2FuZyA9IGlmX2Vsc2UocmVsX3hfYWJzX2NvcnJfb3RoZXI+MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZ19yX2FuZ19fcmFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5nX2xfYW5nX19yYWQpLAogICAgICAgICBjb250cmFfd2luZ19hbmcgPSBpZl9lbHNlKHJlbF94X2Fic19jb3JyX290aGVyPDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmdfcl9hbmdfX3JhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZ19sX2FuZ19fcmFkKQogICAgICAgICApCmFsbF9yYXdkYXRhCmBgYAoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGFicyhpcHNpX3dpbmdfYW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKT4oMTUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoaXBzaV93aW5nX2FuZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk+KDIwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoaXBzaV93aW5nX2FuZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk+KDI1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoaXBzaV93aW5nX2FuZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk+KDMwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoaXBzaV93aW5nX2FuZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk+KDM1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQoKCgoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMyxwMixwNCxwNSksCiAgICAgICAgICBsYWJlbHMgPSBjKCJpcHNpLCA+MTVkZWciLCJpcHNpLCA+MjBkZWciLCJpcHNpLCA+MjVkZWciLCJpcHNpLCA+MzBkZWciLCJpcHNpLCA+MzVkZWciKSwKICAgICAgICAgIGhqdXN0ID0gMCwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSA1LAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGFicyhjb250cmFfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigxNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGFicyhjb250cmFfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigyMCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0oYWJzKGNvbnRyYV93aW5nX2FuZ1t3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk+KDI1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShhYnMoY29udHJhX3dpbmdfYW5nW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKT4oMzAqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnA1IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKGFicyhjb250cmFfd2luZ19hbmdbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pPigzNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKCgoKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDMscDIscDQscDUpLAogICAgICAgICAgbGFiZWxzID0gYygiY29udHJhLCA+MTVkZWciLCJjb250cmEsID4yMGRlZyIsImNvbnRyYSwgPjI1ZGVnIiwiY29udHJhLCA+MzBkZWciLCJjb250cmEsID4zNWRlZyIpLAogICAgICAgICAgaGp1c3QgPSAwLAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDUsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKCgoKCgoKCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgbXV0YXRlKGlwc2lfd2luZ19sZW4gPSBpZl9lbHNlKHJlbF94X2Fic19jb3JyX290aGVyPjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmdfcl9sZW5fX3B4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5nX2xfbGVuX19weCksCiAgICAgICAgIGNvbnRyYV93aW5nX2xlbiA9IGlmX2Vsc2UocmVsX3hfYWJzX2NvcnJfb3RoZXI8MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZ19yX2xlbl9fcHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmdfbF9sZW5fX3B4KQogICAgICAgICApCmFsbF9yYXdkYXRhCmBgYAoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnRlbXAgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIuNSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkIDwgKDIqcGkvMykpICU+JQogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+PSAoMCkpICU+JQogIGZpbHRlcih3aW5nX2xfYW5nX19yYWQgPiAoLTIqcGkvMykpICU+JQogIGZpbHRlcih3aW5nX3JfYW5nX19yYWQgPCAoMipwaS8zKSkgJT4lCiAgZmlsdGVyKHdpbmdfbF9hbmdfX3JhZCA8PSAwKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkID49IDApICU+JQogIGZpbHRlcihkaXN0X3RvX3dhbGxfX21tID4gMikgIyU+JQogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgCgogIAogIApwMSA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwMiA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwMyA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQyIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwNCA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCnJtKHRlbXApCmBgYAoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQp0ZW1wIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyKnBpLzMpKSAlPiUKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPj0gKDApKSAlPiUKICBmaWx0ZXIod2luZ19sX2FuZ19fcmFkID4gKC0yKnBpLzMpKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkIDwgKDIqcGkvMykpICU+JQogIGZpbHRlcih3aW5nX2xfYW5nX19yYWQgPD0gKDApKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkID49ICgwKSkgJT4lCiAgZmlsdGVyKGRpc3RfdG9fd2FsbF9fbW0gPiAyKSAlPiUKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgCgogIAogIApwMSA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwMiA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwMyA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQyIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwNCA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCnJtKHRlbXApCmBgYAoKCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQp0ZW1wIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyKnBpLzMpKSAlPiUKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPj0gKDApKSAlPiUKICBmaWx0ZXIod2luZ19sX2FuZ19fcmFkID4gKC0yKnBpLzMpKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkIDwgKDIqcGkvMykpICU+JQogIGZpbHRlcih3aW5nX2xfYW5nX19yYWQgPD0gKDApKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkID49ICgwKSkgJT4lCiAgZmlsdGVyKGRpc3RfdG9fd2FsbF9fbW0gPiAyKSAlPiUKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgCgogIAogIApwMSA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygxMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDIgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMTAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCnAzIDwtIHRlbXAgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJDIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2JpbjJkKGFlcyh4PWFicyhpcHNpX3dpbmdfYW5nKSwgeT1pcHNpX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIGdlb21fYmluMmQoYWVzKHg9LWFicyhjb250cmFfd2luZ19hbmcpLCB5PWNvbnRyYV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKC1waSxwaSkgKwogIHlsaW0oMCw2MCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDEwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwNCA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygxMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpybSh0ZW1wKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQp0ZW1wIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgyKnBpLzMpKSAlPiUKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPj0gKDApKSAlPiUKICBmaWx0ZXIod2luZ19sX2FuZ19fcmFkID4gKC0yKnBpLzMpKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkIDwgKDIqcGkvMykpICU+JQogIGZpbHRlcih3aW5nX2xfYW5nX19yYWQgPD0gKDApKSAlPiUKICBmaWx0ZXIod2luZ19yX2FuZ19fcmFkID49ICgwKSkgJT4lCiAgZmlsdGVyKGRpc3RfdG9fd2FsbF9fbW0gPiAyKSAlPiUKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgCgogIAogIApwMSA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDUwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCnAyIDwtIHRlbXAgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJCIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX2JpbjJkKGFlcyh4PWFicyhpcHNpX3dpbmdfYW5nKSwgeT1pcHNpX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIGdlb21fYmluMmQoYWVzKHg9LWFicyhjb250cmFfd2luZ19hbmcpLCB5PWNvbnRyYV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKC1waSxwaSkgKwogIHlsaW0oMCw2MCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsNTAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDMgPC0gdGVtcCAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9YWJzKGlwc2lfd2luZ19hbmcpLCB5PWlwc2lfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgZ2VvbV9iaW4yZChhZXMoeD0tYWJzKGNvbnRyYV93aW5nX2FuZyksIHk9Y29udHJhX3dpbmdfbGVuKSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCw1MDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQpwNCA8LSB0ZW1wICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iaW4yZChhZXMoeD1hYnMoaXBzaV93aW5nX2FuZyksIHk9aXBzaV93aW5nX2xlbiksIGJpbnMgPSBjKDIwMCw1MCkpICsKICBnZW9tX2JpbjJkKGFlcyh4PS1hYnMoY29udHJhX3dpbmdfYW5nKSwgeT1jb250cmFfd2luZ19sZW4pLCBiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgtcGkscGkpICsKICB5bGltKDAsNjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDUwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQoKcm0odGVtcCkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==